def sort_with_age(stu):
    return stu['age']


def grow(stu):
    stu['age'] += 1


def fib_with_recursion(n):
    if n in (0, 1):
        return n
    return fib_with_recursion(n - 1) + fib_with_recursion(n - 2)


if __name__ == '__main__':
    # 一、给定以下列表, 通过匿名函数和常规函数根据键age来排序
    classes = [
        {"name": "abyss", "age": 25, "grade": "A"},
        {"name": "kin", "age": 23, "grade": "B"},
        {"name": "tian", "age": 24, "grade": "B"},
        {"name": "hun", "age": 26, "grade": "A"},
        {"name": "exe", "age": 21, "grade": "A"}
    ]
    # 1, 常规函数根据键age来排序classes
    classes.sort(key=sort_with_age)
    print('常规函数根据键age来排序classes', classes, sep='\n')
    # 2, 匿名函数根据键age来排序classes，加个反向和上面的操作区别下
    classes.sort(key=lambda x: x['age'], reverse=True)
    print('\n匿名函数根据键age来排序classes（倒序）', classes, sep='\n')

    # 二、2021年马上就要到来了, 通过map函数将上述同学的age+1
    # 1，创建新列表
    l1 = map(lambda x: {'name': x['name'], 'age': x['age'] + 1, 'grade': x['grade']}, classes)
    print('\n使用map函数将上述同学的age+1（创建新列表）', list(l1), sep='\n')
    # 2，在原列表基础上修改
    list(map(grow, classes))
    print('\n使用map函数将上述同学的age+1（修改原列表）', classes, sep='\n')

    # 三、通过filter函数过滤掉上述同学中grade是A的同学
    l2 = filter(lambda x: False if x['grade'] == 'A' else True, classes)
    print('\n通过filter函数过滤掉上述同学中grade是A的同学', list(l2), sep='\n')

    # 四、使用递归来重构斐波那契函数
    print('\n使用递归来重构斐波那契函数，打印前20个')
    for i in range(20):
        print(fib_with_recursion(i), end=' ')
